package es.gesfutbol.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.Partit;
import es.gesfutbol.domini.implementacio.PartitDeQuiniela;
import es.gesfutbol.domini.implementacio.Quiniela;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class PartitDeQuinielaDao extends HibernateDao<PartitDeQuiniela, Long> implements IPartitDeQuinielaDao{

	@Transactional(readOnly=false)
	public void delete(Long idPartitDeQuiniela) {
		//Obtenim la jornada a eliminar.
		PartitDeQuiniela partitDeQuiniela = this.findById(idPartitDeQuiniela);
		//Eliminem la jornada.
		this.delete(partitDeQuiniela);		
	}	
	
	@Transactional(readOnly = true)
	public PartitDeQuiniela deproxy(PartitDeQuiniela partitDeQuiniela){
		//Quiniela
		Quiniela quiniela = partitDeQuiniela.getQuiniela();
		Hibernate.initialize(quiniela);
		quiniela = HibernateHelper.deproxy(quiniela, Quiniela.class);
		partitDeQuiniela.setQuiniela(quiniela);
		return partitDeQuiniela;	
	}
	
	@Transactional(readOnly = true)
	public List<PartitDeQuiniela> findByIdQuiniela(Long idQuiniela){
		
		@SuppressWarnings("unchecked")
		List<PartitDeQuiniela> listPartitsDeQuiniela = this.getSessionFactory().getCurrentSession().createCriteria(PartitDeQuiniela.class)
	    .addOrder( Order.asc("posicioQuiniela") )
		.createCriteria("quiniela")
	    	.add( Restrictions.like("idQuiniela", idQuiniela) )
	    .list();				
	
		return listPartitsDeQuiniela;		
	}
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public List<PartitDeQuiniela> deproxylist(List<PartitDeQuiniela> partits){
		
		Iterator<PartitDeQuiniela> itPartit = partits.iterator();
		List<PartitDeQuiniela> partits2 = new ArrayList<PartitDeQuiniela>();
		
		while (itPartit.hasNext()) {			
			PartitDeQuiniela partit = itPartit.next();
			this.getSessionFactory().getCurrentSession().lock(partit, LockMode.NONE);			
			//deproxy partit
			Partit p = partit.getPartit();
			Hibernate.initialize(p);
			p = HibernateHelper.deproxy(p, Partit.class);
			partit.setPartit(p);			
			
			
			//deproxy pronostics
//			Set<Pronostic> pronostics = partit.getPronostics();		 	
//		 	Hibernate.initialize(pronostics);
//	        Iterator<Pronostic> itPronostic = pronostics.iterator();
//	        Set<Pronostic> pronostics2 = new HashSet<Pronostic>();
//	        while (itPronostic.hasNext()) {
//	            Pronostic pronostic = itPronostic.next();
//	            Hibernate.initialize(pronostic);
//	            pronostic = HibernateHelper.deproxy(pronostic, Pronostic.class);
//	            pronostics2.add(pronostic);
//	        }
//	        partit.setPronostics(pronostics2);
				        
	        partits2.add(partit);
		}		
		return partits2;		
	}
	
	@Override
	@Transactional(readOnly=false)
	public void save(PartitDeQuiniela partitDeQuiniela) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(partitDeQuiniela);
	}
	
	@Transactional(readOnly = true)
	public PartitDeQuiniela findByIdPartit(Long idPartit){
		PartitDeQuiniela partitDeQuiniela = (PartitDeQuiniela) this.getSessionFactory().getCurrentSession().createCriteria(PartitDeQuiniela.class)
		.createCriteria("partit")
    		.add( Restrictions.like("idPartit", idPartit) )
		.uniqueResult();
		
		return partitDeQuiniela;
	}
	
	@Transactional(readOnly = true)
	public PartitDeQuiniela findByQuinielaIPosicio(Long idQuiniela, Integer posicioQuiniela){
		PartitDeQuiniela partitDeQuiniela = (PartitDeQuiniela) this.getSessionFactory().getCurrentSession().createCriteria(PartitDeQuiniela.class)
		.add( Restrictions.eq("posicioQuiniela", posicioQuiniela) )
		.createCriteria("quiniela")
			.add( Restrictions.eq("idQuiniela", idQuiniela) )		
    	.uniqueResult();
		
		return partitDeQuiniela;
	}
}
